Poniżej przedstawione są kalkulacje poszczególnych wskaźników oceny kandydata (zaproponowanych przez Beniamina), na przykładzie jednego użytkownika.
INPUT: Users.Id
RESULT: User’s number of answers per Tags.CalculatedTagGroup which he had given any answer
"SELECT u.DisplayName, t.CalculatedTagGroup, COUNT(*) AS NumberOfAnswersPerCalculatedTagGroup
FROM Posts p
JOIN PostTags pt ON p.ParentId = pt.PostId
JOIN Tags t ON t.TagName = pt.TagName
JOIN Users u ON u.Id = p.OwnerUserId
WHERE u.Id = 422489 AND p.PostTypeId = 2
GROUP BY u.DisplayName, t.CalculatedTagGroup
ORDER BY u.DisplayName, NumberOfAnswersPerCalculatedTagGroup DESC" -> sql1
dbGetQuery(db, sql1)
INPUT: Users.Id
RESULT: User’s Percentage of accepted answers
percentage of “accepted” answers = NumerOfAcceptedAnswersPerCalculatedTagGroup/NumberOfAnswersPerCalculatedTagGroup (from point 1)
"SELECT u.Id, u.DisplayName, t.CalculatedTagGroup, COUNT(*) AS NumberOfAcceptedAnswersPerCalculatedTagGroup
FROM Posts pa
JOIN Posts pq ON pq.Id = pa.ParentId
JOIN PostTags pt ON pt.PostId = pa.ParentId
JOIN Tags t ON (t.Tagname = pt.Tagname)
JOIN Users u ON u.Id = pa.OwnerUserId
WHERE pq.AcceptedAnswerId = pa.Id AND pa.PostTypeId = 2 AND u.Id = 422489
GROUP BY u.Id, u.DisplayName, t.CalculatedTagGroup
ORDER BY u.DisplayName, NumberOfAcceptedAnswersPerCalculatedTagGroup DESC" -> sql2
dbGetQuery(db, sql2)
INPUT: Users.Id
RESULT: User’s average scores of answers per Tags.CalculatedTagGroup
average scores of answers per Tags.CalculatedTagGroup = SumOfScorePerTag/NumberOfAnswersPerCalculatedTagGroup
"SELECT u.DisplayName, t.CalculatedTagGroup, SUM(p.Score) AS SumOfScorePerTag, SUM(p.Score) / COUNT(*) AS AvarageSumOfScorePerTag
FROM Posts p
JOIN PostTags pt ON p.ParentId = pt.PostId
JOIN Tags t ON t.TagName = pt.TagName
JOIN Users u ON u.Id = p.OwnerUserId
WHERE u.Id = 422489 AND p.PostTypeId = 2
GROUP BY u.DisplayName, t.CalculatedTagGroup
ORDER BY u.DisplayName, AvarageSumOfScorePerTag DESC" -> sql3
dbGetQuery(db, sql3)
INPUT: Users.Id
RESULT: User’s median of percentage answers per question
median of percentage of candidates answers out of total answers under a post = NumberOfUserAnswers / NumberOfPostAnswers
Poniżej zaprezentowane są segmenty użytkowników w podziale na ich punkty reputacji. 1 punkt nadawany jest automatycznie dla każdego konta, czyli są to konta bez punktowanej aktywności. Wydaje się, że za aktywnych użytkowników - takich, że ich aktywność jest wystarczająca by móc ich ocenić - należy uznać użytkowników z minimum 100 punktami reputacji. 100 punktów oznacza [w przybliżeniu] mniej niż 5 postów i/lub mniej niż 5 otrzymanych vote’ów.
Metodę liczenia punktów reputacji można przeczytać tutaj: What is Reputation?.
You gain reputation when:
Poniżej zaprezentowane są segmenty użytkowników w podziale na liczbę udzielonych pytań i odpowiedzi. Wydaje się, że za aktywnych użytkowników - takich, że ich aktywność jest wystarczająca by móc ich ocenić - należy uznać użytkowników z minimum 5 postami, w szczególności jeśli mając mniej niż 5 postów, nie otrzymano żadnych vote’ów.
Legenda:
| Etykieta | Opis |
|---|---|
| (-1,0] | 0 postów |
| (0,1] | 1 post |
| (1,5] | 2-5 postów |
| (5, 1e+05] | powyżej 5 postów |
Poniżej zaprezentowane są segmenty użytkowników biorąc pod uwagę tylko posty z ostatnich 3 lat.
Większość użytkowników (66.43%) nigdy nie napisała żadnej odpowiedzi. Kolejne 9.71% napisało tylko 1 odpowiedź, 9.82% napisało pomiędzy 1 a 5 odpowiedzi. Kolejne przedziały liczby odpowiedzi są zaprezentowane na poniższym wykresie.
Odpowiedzi istniejące w bazie pochodzą z okresu 2008-08-05 - 2019-12-29. Widać, że lata 2008 - 2013 były czasem wzrostu wolumenu odpowiedzi, podczas gdy od 2013 miesięczna liczba odpowiedzi ustabilizowała się. Prezentuje to poniższy wykres.
Aby uzyskać aktualną informację o zaangażowaniu użytkownika na platformie warto ograniczyć analizę tylko do wpisów np. z ostatnich 3 lat.
Ograniczając odpowiedzi tylko do ostatnich 3 lat widać, że ogólny poziom zaangażowania jest niższy niż analizując całą bazę danych. Większość użytkowników (77.21%) nigdy nie napisała żadnej odpowiedzi. Kolejne 9.02% napisało tylko 1 odpowiedź, 7.63% napisało pomiędzy 1 a 5 odpowiedzi. Kolejne przedziały liczby odpowiedzi są zaprezentowane na poniższym wykresie.
Istotnie większa część użytkowników zapostowała co najmniej jedno pytanie niż odpowiedź - 41.43% vs 33.57%
Większość użytkowników (58.57%) nigdy nie napisała żadnego pytania. Kolejne 16.1% napisało tylko 1 pytanie, 14.81% napisało pomiędzy 1 a 5 pytaniami. Kolejne przedziały liczby pytań są zaprezentowane na poniższym wykresie.
Pytania istniejące w bazie pochodzą z okresu 2008-08-05 - 2019-12-29. Tu, w odróżnieniu od odpowiedzi, mamy do czynienia z trendem stale rosnącym. Może to oznaczać, że popyt na wiedzę wciąż rośnie, jednak podaż odpowiadających się ustabilizowała kilka lat temu i nie przyrasta proporcjonalnie do popytu.
Aby uzyskać aktualną informację o zaangażowaniu użytkownika na platformie warto ograniczyć analizę tylko do wpisów np. z ostatnich 3 lat.
Ograniczając pytania tylko do ostatnich 3 lat widać, że ogólny poziom zaangażowania jest niższy niż analizując całą bazę danych. Większość użytkowników (69.89%) nigdy nie napisała żadnego pytania. Kolejne 14.82% napisało tylko 1 pytanie, 10.81% napisało pomiędzy 1 a 5 pytaniami. Kolejne przedziały liczby pytań są zaprezentowane na poniższym wykresie.
W Stackoverflow jest zdefiniowane kilka typów postów, poza najpopularniejszymi czyli pytaniami i odpowiedziami. Jednak inne typy postów niż te analizowane powyżej są zaniedbywalnie rzadkie, więc pomijamy je w analizie. Ich rozkład jest zaprezentowany poniżej.
left_join(posts, posttypes, by = c("PostTypeId" = "Id")) %>% count(PostTypeName = Name) %>% arrange(desc(n))
W naszej bazie postów występuje 27423 unikalnych tagów. Rozkład ćwiartkowy występowania wszystkich tagów wygląda następująco:
Poniżej zaprezentowany jest rozkład najpopularniejszych tagów (występujących więcej niż 350 razy) zgodnie z częstością ich występowania w postach. Im większy rozmiar słowa, tym częściej występuje.
Jak widać, najczęstsze tagi oznaczają języki programowania (java, python, c#) lub popularne elementy programistyczne (regex, arrays, json)
W celu ułatwienia interpretacji tagów, których jest aż 27423 wykonaliśmy ich grupowanie do “supertagów”. Metoda grupowania wykorzystuje fakt, że do większości postów przypisane są co najmniej 2 tagi. Sprawdzamy, który z nich jest popularniejszy ogółem i dla każdego posta przypisujemy ten najpopularniejszy jako supertag do wszystkich pozostałych tagów. Jeżeli w większości postów z naszej bazy danych dany tag jest przypisany do danego supertaga, to uznajemy te grupowanie za zasadne. Jeśli jednak występują różne supertagi i żaden nie stanowi większości, to nie przypisujemy żadnego supertaga.
Poniższa chmura prezentuje wszystkie supertagi, które wytworzyliśmy, 800 sztuk. Pokrywają one ca. 85% wystąpień wszystkich tagów w postach.
dbListTables(db)
[1] "badges" "posts" "posttags" "posttypes" "supertags" "tags" "users"
Lista tabel w bazie stackoverflow @ itm-innovation-mysql.mysql.database.azure.com:3306
Tabele nadające się do wykorzystania to:
Wszystkie 4 tabele są zaprezentowane poniżej.
colnames(badges)
[1] "Id" "UserId" "Name" "Date" "Class" "TagBased"
Lista kolumn w tabeli Badges (informacje o Badge’ach użytkowników). Tabela zawiera 264291 rekordów i 560 unikalnych Badges.Name.
head(badges, 10)
Prezentacja danych w tabeli Badges
colnames(posts)
[1] "Id" "PostTypeId" "AcceptedAnswerId" "ParentId" "CreationDate"
[6] "DeletionDate" "Score" "ViewCount" "Body" "OwnerUserId"
[11] "OwnerDisplayName" "LastEditorUserId" "LastEditorDisplayName" "LastEditDate" "LastActivityDate"
[16] "Title" "Tags" "AnswerCount" "CommentCount" "FavoriteCount"
[21] "ClosedDate" "CommunityOwnedDate"
Lista kolumn w tabeli Posts (lista pytań i odpowiedzi). Tabela zawiera 737178 rekordów, w tym 316789 pytań i 420389 odpowiedzi.
head(posts, 10)
Prezentacja danych w tabeli Posts
colnames(users)
[1] "Id" "Reputation" "CreationDate" "DisplayName" "LastAccessDate" "WebsiteUrl" "Location"
[8] "AboutMe" "Views" "UpVotes" "DownVotes" "ProfileImageUrl" "EmailHash" "AccountId"
Lista kolumn w tabeli Users (informacje na temat użytkowników). Tabela zawiera 41391 rekordów, w tym 41391 unikalnych User ID.
head(users, 10)
Prezentacja danych w tabeli Users